package com.melo.hanoi;

/**
 * @author lichunlong lcl253137@alibaba-inc.com
 * @desc 汉诺塔实现类
 * @date 2025-04-24
 */
public class Hanoi {

    /**
     * 汉诺塔移动方法
     *
     * @param plateQty   hanoi塔的圆盘数量
     * @param plateBaseA hanoi塔的圆盘所在的柱子A
     * @param plateBaseB hanoi塔的圆盘所在的柱子B
     * @param plateBaseC hanoi塔的圆盘所在的柱子C
     */
    public static void hanoiTower(int plateQty, char plateBaseA, char plateBaseB, char plateBaseC) {
        if (plateQty == 1) {
            System.out.println("第1个盘从 " + plateBaseA + "->" + plateBaseC);
            return;
        }

        // 当汉诺塔的圆盘数量大于等于2时, 我们总是可以看做是两个盘: 1、最下边的一个盘 2、上面的所有盘
        // 1、先把最上面的所有盘A->B， 移动过程会使用到C塔
        hanoiTower(plateQty - 1, plateBaseA, plateBaseC, plateBaseB);
        // 2、把最下边的盘A->C
        System.out.println("第" + plateQty + "个盘从 " + plateBaseA + "->" + plateBaseC);
        //3. 把B塔的所有盘从B->C , 移动过程会使用到A塔
        hanoiTower(plateQty - 1, plateBaseB, plateBaseA, plateBaseC);
    }
}
